package pe.gob.mimp.web.controller;

import java.io.IOException;
import java.sql.Blob;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import pe.gob.mimp.model.*;
import pe.gob.mimp.service.CasoSocialService;
import pe.gob.mimp.service.CombosService;
import pe.gob.mimp.service.DerivacionBusquedaService;
import pe.gob.mimp.service.DerivacionService;
import pe.gob.mimp.service.EntidadService;
import pe.gob.mimp.service.MenuUsuarioService;
import pe.gob.mimp.validator.DerivacionValidator;

@Controller
@RequestMapping(value = "/derivacion")
public class DerivacionController {
	@Autowired
	private CombosService combos;
	@Autowired
	private CasoSocialService casoSocialService;
	@Autowired
	private DerivacionService derivacionService;
	@Autowired
	private DerivacionBusquedaService derivacionBusquedaService;
	@Autowired
	private EntidadService entidadService;
	@Autowired
	private MenuUsuarioService menuUsuarioService;

	@RequestMapping(method = RequestMethod.GET)
	public String showCasoForm(
			Model model,
			@RequestParam(value = "idCasosocial", required = true) Long idCasosocial,
			@RequestParam(value = "idDerivacion", required = false) Long idDerivacion,
			HttpServletRequest request) {
		Derivacion derivacion;
		List<TablaParametrica> tipoEntidad;
		List<Entidad> entidades = null;
		Entidad entidad;
		HttpSession session = request.getSession();
		List<MenuUsuario> menu;

		if (session.getAttribute("login") == null) {
			return "redirect:login";
		}
		menu = menuUsuarioService.getMenuUsuarioPorUserName((String) session
				.getAttribute("login"));
                derivacion = new Derivacion();
		tipoEntidad = combos.getListaTipoEntidad();
                SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
                derivacion.setFechaRegistroDeriva(formatoDeFecha.format(new Date()));
		if (idDerivacion != null) {
			derivacion = derivacionService.getDerivacionPorId(idDerivacion);
			if (derivacion.getIdEntidad() != null) {
				entidad = entidadService.getEntidadPorId(derivacion
						.getIdEntidad());
				derivacion.setIdTipoEntidad(entidad.getIdTipoEntidad()
						.getIdTabla());
				entidades = entidadService.getEntidadesPorTipo(entidad
						.getIdTipoEntidad().getIdTabla());
			}
                        if (derivacion.getFechaRegistro() != null)
				derivacion.setFechaRegistroDeriva(formatoDeFecha.format(derivacion.getFechaRegistro()));
		} else {			
			derivacion.setIdCasosocial(idCasosocial);
		}
		model.addAttribute("tipoEntidad", tipoEntidad);
		model.addAttribute("entidades", entidades);
		model.addAttribute("derivacion", derivacion);
		model.addAttribute("menu", menu);
		model.addAttribute("opciones", menu);
		if (idDerivacion != null) {
			model.addAttribute("edita", true);
		} else {
			model.addAttribute("edita", false);
		}
		model.addAttribute("casosocialResumen",
				casoSocialService.getCasoSocialResumen(idCasosocial));
		return "derivacion";
	}

	@SuppressWarnings("deprecation")
	@RequestMapping(method = RequestMethod.POST)
	public String grabaFormulario(Model model, Derivacion derivacion,
			@RequestParam("file") MultipartFile file) {
		Derivacion derivacionTemp;
		derivacion.setIdEntidad(derivacion.getIdEntidad() == 0 ? null
				: derivacion.getIdEntidad());
		if (derivacion.getFechaRegistro() == null) {
			derivacion.setFechaRegistro(new Date());
		}
		if (file.getSize() != 0) {
			try {
				derivacion.setArchivo(file.getOriginalFilename());
				derivacion.setDocumento(file.getBytes());
				derivacion.setContentType(file.getContentType());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}else{
                    if(derivacion.getIdDerivacion()!=null){
			derivacionTemp = derivacionService.getDerivacionPorId(derivacion.getIdDerivacion());
                        if(derivacionTemp.getContentType()!=null){
                            derivacion.setContentType(derivacionTemp.getContentType());
                            derivacion.setDocumento(derivacionTemp.getDocumento());
                        }
                    }
		}
                if (derivacion.getFechaRegistroDeriva() != null) {
			SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
			try {
				derivacion.setFechaRegistro(dateFormat.parse(derivacion.getFechaRegistroDeriva()));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		derivacionService.saveDerivacion(derivacion);
		return "redirect:derivacion?idCasosocial="
				+ derivacion.getIdCasosocial();
	}

	@RequestMapping(value = "/derivaciones", method = RequestMethod.GET)
	public @ResponseBody
	List<DerivacionBusqueda> getDerivaciones(
			@RequestParam(value = "idCasosocial", required = true) Long idCasosocial,
			HttpServletRequest request) {
		HttpSession session = request.getSession();

		if (session.getAttribute("login") == null) {
			return null;
		}
		return derivacionBusquedaService
				.getDerivacionBusquedaPorCaso(idCasosocial);
	}

	@RequestMapping(value = "/entidades", method = RequestMethod.GET)
	public @ResponseBody
	List<Entidad> getEntidades(
			@RequestParam(value = "idTipoEntidad", required = true) Long idTipoEntidad) {
		return entidadService.getEntidadesPorTipo(idTipoEntidad);
	}
}
